using System;
using System.Text.RegularExpressions;

namespace PhraseCorrector.Common
{

    public class Utilities
    {

        // 编译常用的正则表达式
        private static readonly Regex PunctuationRegex = new Regex(@"([。！？；、，,.!?;])", RegexOptions.Compiled);
        private static readonly Regex FullChineseRegex = new Regex(@"^[\u4e00-\u9fa5]+$", RegexOptions.Compiled);
        private static readonly Regex FullLetterRegex = new Regex(@"^[a-zA-Z]+$", RegexOptions.Compiled);
        public static readonly Regex PunctuationOnlyRegex = new Regex(@"^[^\w\s]+$", RegexOptions.Compiled);

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        ///  替换标点符号
        /// </summary>
        /// <param name="input">输入的字符串</param>
        /// <param name="replacement">替换标点符号的字符串</param>
        /// <returns>替换标点符号后的字符串</returns>
        public static string ReplaceBdfh(string input, string replacement)
        {
            // 使用正则表达式匹配标点符号，并将其替换为指定的字符串
            return PunctuationRegex.Replace(input, replacement);
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 移除空格
        /// </summary>
        /// <param name="str">待处理的字符串</param>
        /// <returns>不包含空格的字符串</returns>
        private static string ReplaceSpace(string str)
        {
            // 如果输入字符串为空，则直接返回空字符串
            return (str == null)
                ? ""
                // 使用字符串的Replace方法移除所有空格
                : str.Replace(" ", "");
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 检查字符串是否符合指定的语言规则。
        /// </summary>
        /// <param name="str">待检查的字符串。</param>
        /// <param name="pattern">正则表达式模式。</param>
        /// <returns>如果字符串符合指定的语言规则，则返回true；否则返回false。</returns>
        private static bool IsLanguage(string str, string pattern)
        {
            // 判断是否为空
            return !string.IsNullOrWhiteSpace(str) && Regex.IsMatch(ReplaceSpace(str), pattern);
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 检查字符串首字符是否汉字。
        /// </summary>
        /// <param name="str">待检查的字符串。</param>
        /// <returns>如果字符串首字符是汉字，则返回true；否则返回false。</returns>
        public static bool IsChineseBegin(string str)
        {
            // 移除字符串中的空格并获取处理后的字符串
            var chars = ReplaceSpace(str);
            // 判断字符串是否非空且首字符是否在汉字的Unicode范围内
            return chars != "" && chars[0] >= '\u4e00' && chars[0] <= '\u9fa5';
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 检查字符串是否全部由汉字组成（与IsChinese功能重复）。
        /// </summary>
        /// <param name="str">待检查的字符串。</param>
        /// <returns>如果字符串全部由汉字组成，则返回true；否则返回false。</returns>
        public static bool IsFullChinese(string str)
        {
            // 移除字符串中的空格，因为检查汉字时不考虑空格
            var chars = ReplaceSpace(str);
            // 遍历字符串中的每个字符
            foreach (var c in chars)
            {
                // 汉字的Unicode编码范围是\u4e00到\u9fa5,如果字符不在这个范围内，则不是汉字
                if (c < '\u4e00' || c > '\u9fa5') return false;
            }
            // 所有字符都是汉字
            return true;
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 检查字符串首字符是否英文字母。
        /// </summary>
        /// <param name="str">待检查的字符串。</param>
        /// <returns>如果字符串首字符是字母，则返回true；否则返回false。</returns>
        public static bool IsLetterBegin(string str)
        {
            // 移除字符串中的空格并转换为小写，以进行后续的字母检查
            var chars = ReplaceSpace(str).ToLower();
            // 检查处理后的字符串是否非空且首字母在a到z之间
            return chars != "" && chars[0] >= 'a' && chars[0] <= 'z';
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 检查字符串是否完全由字母组成。
        /// </summary>
        /// <param name="str">待检查的字符串。</param>
        /// <returns>如果字符串完全由字母组成，则返回true；否则返回false。</returns>
        public static bool IsFullLetter(string str)
        {
            // 移除字符串中的空格后，检查字符串是否仅包含字母
            return FullLetterRegex.IsMatch(ReplaceSpace(str));
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 判断字符串是否为数字开头
        /// </summary>
        /// <param name="str">待检查的字符串</param>
        /// <returns>如果字符串以数字开头，则返回true；否则返回false</returns>
        public static bool IsDigit(string str)
        {
            // 移除字符串中的空格
            var chars = ReplaceSpace(str);
            // 检查移除空格后的字符串是否不为空且第一个字符是否为数字
            return chars != "" && chars[0] >= '0' && chars[0] <= '9';
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 在加载词库失败时调用的异常退出方法。
        /// </summary>
        /// <param name="str">未能成功加载的词库名称。</param>
        public static void FailureExit(string str)
        {
            // 记录错误日志，指出加载词库失败，用于故障排查
            Logger.Log.Error($"异常退出，加载 {str} 词库失败！");
            // 退出程序
            Environment.Exit(0);
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 检查字符串是否全部由标点符号组成。
        /// </summary>
        /// <param name="input">待检查的字符串。</param>
        /// <returns>如果字符串全部由标点符号组成，则返回true；否则返回false。</returns>
        public static bool IsPunctuation(string input)
        {
            // 使用正则表达式匹配字符串，判断是否全部由标点符号组成
            return PunctuationOnlyRegex.IsMatch(input);
        }
    }
}